package com.zbb.exam_system.service;

import com.zbb.exam_system.dto.JsonResult;
import com.zbb.exam_system.dto.TableDto;
import com.zbb.exam_system.dto.UserDto;
import com.zbb.exam_system.entity.Student;
import com.zbb.exam_system.entity.Teacher;
import com.zbb.exam_system.entity.User;
import com.zbb.exam_system.vo.StudentVo;
import com.zbb.exam_system.vo.UpdateUserPwdVo;
import com.zbb.exam_system.vo.UserVo;

import java.util.List;

/**
 * @author zbbstart
 * @date 2021/2/8 - 15:34
 */
public interface UserService {
    /**
     * 根据用户编号查询该用户的所有权限
     *
     * @param userId 用户编号
     * @return 该用户的所有权限
     */
    List<Integer> getUserRolesByUserId(Integer userId);

    /**
     * 根据用户姓名查询该用户的所有信息，以及其是否存在
     *
     * @param username 用户名称
     * @return 该用户的所有信息
     */
    User getUserInfoByUserName(String username);

    /**
     * 登录
     *
     * @param userVo 前端传来的参数的封装
     */
    void login(UserVo userVo);

    /**
     * 从token中获取用户的信息
     *
     * @param token 用户健全的token
     * @return 用户的信息
     */
    UserDto getUserInfoByToken(String token);

    /**
     * 修改密码
     *
     * @param updateUserPwdVo 前端传来的修改密码的信息的封装
     * @return 修改是否成功的JSON格式
     */
    JsonResult updateUserPwd(UpdateUserPwdVo updateUserPwdVo);

    /**
     * 分页查询获取所有的老师用户
     *
     * @param pageNo 页码
     * @param size   页面的大小
     * @return 所有的老师用户
     */
    TableDto getAllTeacherUsersByPage(Integer pageNo, Integer size);

    /**
     * 新增老师用户
     *
     * @param user 老师用户信息的封装
     */
    void insertTeacherUser(User user);

    /**
     * 单个或批量删除老师用户
     *
     * @param teacherNos 老师用户编号列表
     */
    void deleteTeacherUsers(List<Integer> teacherNos);

    /**
     * 修改老师的名称
     *
     * @param user 前端用户信息的封装
     */
    void updateTeacherName(User user);

    /**
     * 分页查询获取所有的老师用户
     *
     * @param pageNo 页码
     * @param size   页面的大小
     * @param token  前端鉴权加密的用户信息
     * @return 所有的老师用户
     */
    TableDto getAllStudentUsersByPage(Integer pageNo, Integer size, String token);

    /**
     * 新增学生
     *
     * @param studentVo 前端传来的学生信息的封装
     */
    void insertStudentUser(StudentVo studentVo);

    /**
     * 修改学生信息
     *
     * @param studentVo 前端传来的学生信息的封装
     * @param token     前端鉴权加密的用户信息
     */
    void updateStudentUserInfo(StudentVo studentVo, String token);

    /**
     * 根据学生编号获取教师信息
     * @param studentNo 学生编号
     * @return 教师信息
     */
    Teacher getteacherInfoByStudentNo(Integer studentNo);

    /**
     * 单个或批量删除学生用户
     *
     * @param studentNos 学生用户编号列表
     */
    void deleteStudentUsers(List<Integer> studentNos);

    /**
     * 批量导入学生
     * @param token 前端鉴权加密的用户信息
     * @param pathName 路径名称
     */
    void batchImportStudent(String token,String pathName);

    /**
     * 更改用户的状态
     * @param userId 用户编号
     */
    void updateUserStatus(Integer userId);
}
